home *** CD-ROM | disk | FTP | other *** search
- #!/bin/bash
- # $Id: instpkg.sh,v 1.36 1999/08/05 16:04:49 ray Exp $
-
- Source=/mnt/install/col
- SourceP=$Source/install/RPMS
- SourceD=$Source/data
-
- Target=/mnt/root
- #LOG=/dev/tty7
- LOG=$Target/var/adm/LST/debug/instpkg
- AddFile=/tmp/instpkg.add
- SkipFile=/tmp/instpkg.skip
- ProbFile=/tmp/instpkg.trouble
-
- InstFlags="--nodeps --noscripts --notriggers --noorder --force"
-
- Interactive=true
-
- HaveWC=false
- # implemented modes are: InstBulk, InstSingle, InstCopySingle, InstCopyRSingle
- # currently not implemented: InstCopyBulk, InstCopyChunksSingle
- SlowMode=InstCopyRSingle
- FastMode=InstSingle
- DebugDF=true
- #DebugDF='eval df | fgrep $Target'
- CacheD=$Target/usr/InstCache
- FiddleOpt=false
- #Nice="nice -n 19"
- RetryDelay=15
-
- nl="
- "
-
- # global variables
- list=""
- List=""
-
- false() { return 1; }
- true() { return 0; }
- PushD() { pushd "$@" > /dev/null; }
- PopD() { popd "$@" > /dev/null; }
-
- rmdir() {
- local d
-
- if [ -x /bin/rmdir ]; then
- /bin/rmdir "$@"
- else
- for d in "$@"; do
- perl -e 'rmdir("'$d'") || print STDERR "rmdir: '$d': $!\n"'
- done
- fi
- }
-
- RunningOnFastMachine() {
- if ! $Interactive
- # or RAM >= 64MB
- # and $Source on ( ( SCSI-CD && speed >= 12 )
- # or ( ATAPI-CD && speed >= 32 )
- # or ( network (&& speed >= 100Mbit)? )? )
- #
- then
- return 0
- else
- return 1
- fi
- }
-
- LoadLimitter() {
- local limit=$1; shift
- local delay=$1; shift
- local a1 a5 a10 b c
- read a1 a5 a10 b c < /proc/loadavg
- [ $[${a1%.*} + 1]${a1#*.} -ge $[$limit + 100] ] && {
- echo "+++ load $a1 $a5 $a10"
- sleep $delay
- }
- }
-
- InstFramework() {
- local f
- local d
-
- PushD $Target
- ls -lR > /tmp/instpkg-lR
- echo "Installing framework.cgz"
- echo "Installing framework.cgz" 1>&3
- zcat $SourceD/framework.cgz | cpio -idmu || exit 1
- for d in opt/{bin,man}; do
- [ -d $d ] || mkdir -p $d
- done
- for f in passwd shadow group hosts sysconfig/network; do
- [ ! -r etc/$f -a -r etc/$f- ] && mv etc/$f- etc/$f
- done
- rm -vf etc/*- etc/sysconfig/*-
- mv /tmp/instpkg-lR var/adm/LST/debug/
-
- # Try to fix '/opt'
- $FiddleOpt && (
- set -x
- # /opt is not mount-point
- fgrep -v " $Target/opt" /proc/mounts > /dev/null &&
- # also no sym-link
- [ ! -L $Target/opt ] &&
- # we have a separate /usr
- fgrep " $Target/usr" /proc/mounts > /dev/null &&
- # small '/' (FIXME: how should I check?)
- true &&
- # => copy & remove & make sym-link
- cp -a $Target/opt $Target/usr/opt &&
- rm -rf $Target/opt &&
- ln -s usr/opt $Target/opt
- )
- PopD
- }
-
- InstBulk() {
- local errCount=0
-
- echo "*** $(date): installing $count packages (bulk mode)"
- echo $count 1>&3
- InstFramework
-
- PushD $SourceP
- $Nice rpm -iv $InstFlags --root $Target $List 1>&3 || {
- errCount=$[ $errCount + 1];
- echo "Error installing at least one package! Trying to continue..." 1>&2
- }
- PopD
- return $errCount
- }
-
- InstSingle() {
- local errCount=0
- local p
- local retry=""
-
- echo "*** $(date): installing $count packages (single action)"
- echo $count 1>&3
- $DebugDF
- InstFramework
-
- PushD $SourceP
- for p in $List; do
- echo "Installing '$p'"
- $Nice rpm -iv $InstFlags --root $Target $p 1>&3 || {
- retry="$retry $p"
- errCount=$[ $errCount + 1]
- echo "1: $p" >> $ProbFile
- echo "Error installing '$p'! Will try again later..." 1>&2
- }
- $DebugDF
- done
- PopD
- [ $errCount != 0 ] || return 0
- # else: try harder!
- echo "*** $(date): package installation encountered $errCount problems..."
- PushD $SourceP
- errCount=0
- for p in $retry; do
- echo "Retry installation of '$p'"
- sleep $RetryDelay
- $Nice rpm -iv $InstFlags --root $Target $p 1>&3 || {
- errCount=$[ $errCount + 1]
- echo "2: $p" >> $ProbFile
- echo "Error installing '$p' (2nd try)! Trying to continue..." 1>&2
- echo "Error installing '$p'! Trying to continue..." 1>&3
- }
- $DebugDF
- done
- PopD
- return $errCount
- }
-
- InstCopySingle() {
- local errCount=0
- local p
- local cnt=$count
- local retry=""
-
- count=$[($count - 1) * 2 + 1]
- echo "*** $(date): installing $count packages (copy-then-single)"
- echo "LD_LIBRARY_PATH=$LD_LIBRARY_PATH"
- echo "PATH=$PATH"
- $DebugDF
-
- echo $count 1>&3
- InstFramework
-
- echo "*** $(date): Copying $cnt packages (COPY-then-single)"
- $DebugDF
- mkdir -p $CacheD
- PushD $CacheD
- for p in $List; do
- LoadLimitter 110 5
- echo "Copying '$p'"
- cp -v $SourceP/$p . 1>&3 || {
- echo "C: $p" >> $ProbFile
- echo "Error copying '$p'! Trying to continue..." 1>&2
- sleep $RetryDelay
- }
- done
- $DebugDF
-
- echo "*** $(date): installing $cnt packages (copy-then-SINGLE)"
- for p in $List; do
- [ -r $p ] || {
- retry="$retry $p"
- errCount=$[ $errCount + 1]
- echo "F: $p" >> $ProbFile
- echo "Installing '$p' delayed due to copy-error!" 1>&2
- continue
- }
- LoadLimitter 150 3
- echo "Installing '$p'"
- $Nice rpm -iv $InstFlags --root $Target $p 1>&3 || {
- retry="$retry $p"
- errCount=$[ $errCount + 1]
- echo "1: $p" >> $ProbFile
- echo "Error installing '$p'! Will try again later..." 1>&2
- }
- rm -f $p
- $DebugDF
- done
- PopD
- rmdir $CacheD
- [ $errCount != 0 ] || return 0
- # else: try harder!
- echo "*** $(date): package installation encountered $errCount problems..."
- PushD $SourceP
- errCount=0
- for p in $retry; do
- echo "Retry installing '$p'"
- sleep $RetryDelay
- $Nice rpm -iv $InstFlags --root $Target $p 1>&3 || {
- errCount=$[ $errCount + 1]
- echo "2: $p" >> $ProbFile
- echo "Error installing '$p' (2nd try)! Trying to continue..." 1>&2
- echo "Error installing '$p'! Trying to continue..." 1>&3
- }
- $DebugDF
- done
- PopD
- return $errCount
- }
-
- InstCopyRSingle() {
- local errCount=0
- local llpB=$LD_LIBRARY_PATH
- local llp=""
- local pB=$PATH
- local o
-
- echo "*** $(date): preparing run-time optimized InstCopySingle()"
- $DebugDF
- mkdir -p $CacheD/{bin,lib}
- for o in /bin/{rpm,bash,cpio} /sbin/chroot /usr/bin/{perl,nice}; do
- LoadLimitter 110 3
- cp -p $o $CacheD/bin
- done
- for o in $(ls {,/usr}/lib/l*.so* | sed -e '/qt\|stdc\|libc.so.6/d'); do
- LoadLimitter 110 3
- cp -p $o $CacheD/lib
- done
- ln -sf libc-2.*.so $CacheD/lib/libc.so.6
- $DebugDF
-
- [ -n "$llpB" ] && llp=:$llpB
- export LD_LIBRARY_PATH=$CacheD/lib$llp; PATH=$CacheD/bin:$PATH
- InstCopySingle
- errCount=$?
- LD_LIBRARY_PATH=$llpB; [ -z "$llpB" ] && unset LD_LIBRARY_PATH; PATH=$pB
-
- rm -rf $CacheD/{bin,lib}
- rmdir $CacheD
- $DebugDF
- return $errCount
- }
-
- ExpandList() {
- local m=$1; shift; # either 'full' or 'NVR'
- local d=$1; shift
-
- perl -e '
- $d = "'$d'"; $mode = "'$m'"; $e="noarch|i386|ppc|alpha|sparc";
- open(IN, "ls $d |") || die;
- while ( <IN> ) {
- chop;
- if ( /^((.*)-([^-]+)-([^-]+))\.($e)\.rpm$/o ) {
- $Full{$2} = $Full{$1} = $_;
- $NVR{$2} = $1;
- $Arch{$2} = $5;
- }
- }
- close(IN);
- while ( <> ) {
- chop;
- $_ = (exists( $Full{$_})) ? $Full{$_} . "\n" : ""
- if ( $mode eq "full" );
- $_ = ((exists($NVR{$_})) ? $NVR{$_} : $_) . "\n"
- if ( $mode eq "NVR" );
- next if ( exists( $O{$_}) );
- $O{$_} = 1;
- print "$_" if ( $_ );
- }
- ' "$@"
- }
-
- Main() {
- local sel
- local count
- local errCount=0
-
- echo "*** $(date): instpkgs $1"
-
- case "$1" in
- /*)
- # non-Interactive mode...
- Interactive=false
- sel="$1"
- [ -r "$sel" ] || {
- echo "instpkg: '$sel' not readable! Bailing out..." 1>&2
- exit 1
- }
- ;;
- all|"")
- sel=all
- ;;
- *)
- sel="$1"
- ;;
- esac
-
- if ! $Interactive; then
- # some magic incantations to expand name to name-version-release...
- echo "*** $(date): expanding $sel list..."
- list=$(ExpandList NVR $SourceP $sel)
- elif [ -r $SourceD/pkgs-$sel ]; then
- list=$(cat $SourceD/pkgs-$sel)
- elif [ -r $SourceD/pkgs-$sel.generic ]; then
- # some magic incantations to expand name to name-version-release...
- echo "*** $(date): expanding $sel-generic list..."
- list=$(ExpandList NVR $SourceP $SourceD/pkgs-$sel.generic)
- elif [ "$sel" = "all" ]; then
- echo "*** $(date): creating 'pkgs-all' on-the-fly..."
- list=$(ls $SourceP | sed -n 's/\.[^.][^.]*\.rpm$//p')
- else
- echo "instpkg: cannot evaluate package list" 1>&3
- exit 1
- fi
- [ "$sel" != "all" ] && # requested by Ralf
- [ -z "$(fgrep pcmcia_core /proc/modules)" ] && {
- echo "*** $(date): apparently no laptop => omitting 'pcmcia-cs'..."
- echo "pcmcia-cs" >> $SkipFile
- }
- [ -f "$SkipFile" ] && {
- echo "*** $(date): removing '$SkipFile' from list..."
- ExpandList NVR $SourceP $SkipFile > $SkipFile.expanded
- list=$(echo "$list" | fgrep -v -f $SkipFile.expanded)
- }
- [ -f "$AddFile" ] && {
- echo "*** $(date): adding '$AddFile' to list..."
- list="$list$nl$(ExpandList NVR $SourceP $AddFile)"
- }
- List=$(echo "$list" | ExpandList full $SourceP -)
-
- count=1
- for p in $list; do
- count=$[ $count + 1 ]
- done
-
- # now install with preselected method...
- if RunningOnFastMachine; then
- $FastMode
- else
- $SlowMode
- fi
- errCount=$?
- if [ $errCount != 0 ]; then
- echo "*** $(date): packages installed, BUT $errCount problems..."
- else
- echo "*** $(date): packages installed (no problems)..."
- fi
-
- echo "*** $(date): prepareing post-install scripts"
- echo "* post *" 1>&3
- count=2
- PushD $Target/var/adm/LST/PostIn || exit 1
- for p in $list; do
- rpm --PostIn --root $Target $p |
- sed -e '/^\/sbin\/ldconfig$/d' -e '/^\/bin\/sh$/d' > $p
- [ -s $p -a "$(cat $p)" != "$(echo '#! /bin/sh')" ] || {
- rm -f $p
- continue
- }
- chmod 755 $p
- case "$p" in
- man-[0-9]*|teTeX-[0-9]*)
- mv $p ../Unconfigured/$p.todo
- continue
- ;;
- esac
- count=$[ $count + 1 ]
- done
- list=$(ls)
- PopD
-
- echo "*** $(date): about to run $count scripts"
- echo $count 1>&3
-
- mount -t proc Target $Target/proc
- PushD $Target
- echo "Running 1st ldconfig"
- echo "Installing ldconfig-a post" 1>&3
- chroot $Target /sbin/ldconfig
- for p in $list; do
- echo "%PostIn '$p'"
- echo "Installing $p post" 1>&3
- chroot $Target /var/adm/LST/PostIn/$p
- done
- echo "Running 2nd ldconfig"
- echo "Installing ldconfig-b post" 1>&3
- chroot $Target /sbin/ldconfig
- umount $Target/proc
- PopD
- echo "*** $(date): %PostIn done"
-
- echo "*** $(date): misc fixup"
- set -x
- PushD $Target
- # hack for booter
- false && {
- [ -e dev/ttyNULL ] || mv dev/tty0 dev/ttyNULL
- [ -e dev/tty0 ] || ln -s tty1 dev/tty0
- }
-
- # fix for linux-kernel/rc.modules
- chroot $Target sbin/depmod -a
-
- # fixes for LISA
- [ -d initrd ] || mkdir -p initrd
- [ -d usr/lib/LST ] || mkdir -p usr/lib/LST
- [ -f /IDENTIFY ] &&
- cp -a /IDENTIFY usr/lib/LST/IDENTIFY.root
- [ -f /floppy/IDENTIFY ] &&
- cp -a /floppy/IDENTIFY usr/lib/LST/IDENTIFY.boot
- echo "$(uname -a)" > usr/lib/LST/IDENTIFY.kernel
-
- # fix for COAS
- [ ! -r usr/lib/LST/col.master -a -r $SourceD/col.master ] &&
- cp -a $SourceD/col.master usr/lib/LST
-
- PopD
- set +x
- echo "* done *" 1>&3
- echo "*** $(date): FINISHED"
-
- return $errCount
- }
-
- mkdir -p ${LOG%/*}
- exec - 3>&1 1>>$LOG 2>&1
- Main "$@"
- exit $?
-
- # Local Variables:
- # mode: sh
- # sh-indentation: 2
- # End:
-
-